]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
altTab: Consider attached modals for window order
authorFlorian Müllner <fmuellner@gnome.org>
Thu, 6 Oct 2016 21:32:08 +0000 (23:32 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Fri, 7 Oct 2016 12:51:15 +0000 (14:51 +0200)
Similar to bug 667552 for the app switcher, attached modal dialogs
can result in an unexpected window order in the window switcher:
Selecting a window with an attached dialog will focus the dialog
instead, but as the dialog itself is ignored in the window list,
its last-used timestamp is not taken into account for the position
in the MRU list. Fix this by fetching the list of all NORMAL windows
and filter out skip-taskbar windows ourselves, while making sure that
windows appear in the position of their attached modal dialog where
appropriate.

https://bugzilla.gnome.org/show_bug.cgi?id=747153

js/ui/altTab.js

index dfdf9c3f93c26faf2d3808fa268de482e00b7d95..d101335681e52b9630baced619b1dd100fdc4a00 100644 (file)
@@ -46,6 +46,19 @@ function _createWindowClone(window, size) {
                                y_expand: true });
 };
 
+function getWindows(workspace) {
+    // We ignore skip-taskbar windows in switchers, but if they are attached
+    // to their parent, their position in the MRU list may be more appropriate
+    // than the parent; so start with the complete list ...
+    let windows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL,
+                                              workspace);
+    // ... map windows to their parent where appropriate ...
+    return windows.map(w => {
+        return w.is_attached_dialog() ? w.get_transient_for() : w;
+    // ... and filter out skip-taskbar windows and duplicates
+    }).filter((w, i, a) => !w.skip_taskbar && a.indexOf(w) == i);
+}
+
 const AppSwitcherPopup = new Lang.Class({
     Name: 'AppSwitcherPopup',
     Extends: SwitcherPopup.SwitcherPopup,
@@ -517,7 +530,7 @@ const WindowSwitcherPopup = new Lang.Class({
 
     _getWindowList: function() {
         let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
-        return global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
+        return getWindows(workspace);
     },
 
     _keyPressHandler: function(keysym, action) {
@@ -555,7 +568,7 @@ const WindowCyclerPopup = new Lang.Class({
 
     _getWindows: function() {
         let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
-        return global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
+        return getWindows(workspace);
     },
 
     _keyPressHandler: function(keysym, action) {